// https://zh.wikipedia.org/wiki/Setjmp.h

/*
setjmp(buf) 保存当前context 到buf
如果是从setjmp直接调用返回，setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回，setjmp返回非零值。

longjmp(buf,value) 加载buf中的上下文
value的值从longjmp传递给setjmp

output
$ gcc setjmp.c 
$ ./a.out 
x=0
second
x=1
main


*/
#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
	printf("second\n");
	longjmp(buf, 1);
}

void first(void) {
	second();
	printf("first\n");
}

void main(void) {
	int x;
	x = setjmp(buf);
	printf("x=%d\n", x);
	if (!x) {
		first();
	} else {
		printf("main\n");
	}
}
